package com.chinatechstar.file.service;

import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.chinatechstar.file.dto.CurrDirFileDTO;
import com.chinatechstar.file.dto.CurrDirFileMapDTO;
import com.chinatechstar.file.dto.SysDirTreeDTO;
import com.chinatechstar.file.entity.SysFile;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;

/**
 * 业务逻辑接口层
 */
public interface SysFileService {

    /**
     * 查询所有数据
     *
     * @return List<SysFile>
     */
    List<SysFile> findSysFileAll();

    /**
     * 查询分页
     *
     * @param currentPage 当前页数
     * @param pageSize    每页记录数
     * @param name        名称
     * @param sorter      排序
     * @return Map<String, Object>
     */
    Map<String, Object> findSysFileByCondition(Integer currentPage, Integer pageSize, String name, String sorter);

    /**
     * 查询导出数据列表
     *
     * @param paramMap 参数Map
     * @return List<LinkedHashMap < String, Object>>
     */
    List<LinkedHashMap<String, Object>> findSysFileForExcel(Map<String, Object> paramMap);

    /**
     * 根据主键ID数据查询数据
     *
     * @param id ID
     * @return SysFile
     */
    SysFile findSysFileById(Long id);

    /**
     * 根据主键ID数组查询数据
     *
     * @param ids ID数组
     * @return List<SysFile>
     */
    List<SysFile> findSysFileByIds(Long[] ids);

    /**
     * 新增
     *
     * @param sysFile 实体
     */
    void insertSysFile(SysFile sysFile);

    /**
     * 批量新增
     *
     * @param sysFiles 实体数组
     */
    void insertSysFiles(List<SysFile> sysFiles);

    /**
     * 复制或移动目录和文件命令
     *
     * @param command      操作命令 copy | move
     * @param fileIds      需要复制或移动的目录和文件id数组
     * @param targetId     目录id
     * @param fileBusiness 业务id
     */
    HashMap<String, HashMap<String, String>> copyMoveCommand(String command, Long[] fileIds, Long targetId, Long fileBusiness);


    /**
     * 文件或目录下载
     *
     * @param fileId   文件目录id
     * @param command  file | dir
     * @param response Http响应消息
     */
    void downloadCommand(Long fileId, String command, HttpServletResponse response);


    /**
     * 目录操作
     *
     * @param command       操作命令 mkdir | rename
     * @param dirName       目录名称
     * @param fileBusiness  业务id
     * @param fileStorageId 文件仓储id
     * @param targetId      目标id
     */
    HashMap<String, String> dirCommand(String command, String dirName, Long fileBusiness, Long fileStorageId, Long targetId) throws IOException;

    /**
     * 打开目录
     *
     * @param businessId 业务id
     * @param targetId   目标目录id
     * @param isReview   是否查询需要的审核文件
     * @return List<SysFile>
     */
    CurrDirFileMapDTO openDir(Long businessId, Long targetId, boolean isReview);

    /**
     * 搜索业务关联的文件
     *
     * @param businessId 业务id
     * @param fileName   目标目录id
     * @param isReview   是否查询需要的审核文件
     * @return List<SysFile>
     */
    CurrDirFileMapDTO searchFile(Long businessId, String fileName, boolean isReview);

    /**
     * 查询业务的树状结构目录
     *
     * @param businessId 业务id
     * @return SysDirTreeDTO
     */
    SysDirTreeDTO findDirTree(Long businessId);

    /**
     * 编辑
     *
     * @param sysFile 实体
     */
    void updateSysFile(SysFile sysFile);

    /**
     * 批量编辑
     *
     * @param sysFiles 实体数组
     */
    void updateSysFiles(List<SysFile> sysFiles);

    /**
     * 删除
     *
     * @param id ID
     */
    void deleteSysFileById(Long id);

    /**
     * 批量删除
     *
     * @param ids ID数组
     */
    void deleteSysFileByIds(Long[] ids);

    /**
     * 软删除
     *
     * @param id ID
     */
    void softDeleteSysFileById(Long id);

    /**
     * 批量软删除
     *
     * @param ids ID数组
     */
    void softDeleteSysFileByIds(Long[] ids);

}
